package com.sam.designpatterns

import java.lang.reflect.InvocationHandler
import java.lang.reflect.Method
import java.lang.reflect.Proxy
import javax.swing.plaf.basic.BasicComboPopup

// 诉讼接口类
interface ILawsuit {
    // 提交申请
    fun submit()

    // 进行举证
    fun burden()

    // 开始辩护
    fun defend()

    // 诉讼完成
    fun finish()

    fun test(a:Int)
}

// 李四:需要参与这个流程
class LiSi : ILawsuit {
    override fun submit() {
        println("因老板拖欠工资，申请仲裁！")
    }

    override fun burden() {
        println("劳动合同及过去一年的工资卡银行流水！")
    }

    override fun defend() {
        println("证据确凿，没什么好辩护了！")
    }

    override fun finish() {
        println("诉讼成功，判决老板7天补发工资！")
    }

    override fun test(a: Int) {
        println("111-----$a")
    }
}

// 代理律师
//class Lawyer(
//    // 委托人
//    var trustor: ILawsuit
//    ) : ILawsuit {
//
//    override fun submit() {
//        trustor.submit()
//    }
//
//    override fun burden() {
//        trustor.burden()
//    }
//
//    override fun defend() {
//        trustor.defend()
//    }
//
//    override fun finish() {
//        trustor.finish()
//    }
//}

// 动态代理类
class DynamicProxy(var obj: Any): InvocationHandler {
    override fun invoke(proxy: Any?, method: Method, args: Array<out Any>?): Any? {
        // kotlin 调用java 可变参数的兼容写法
        return method.invoke(obj, *(args ?: emptyArray()))
    }
}

fun main() {
    val lisi = LiSi()
    val proxy = DynamicProxy(lisi)
    // 获取被代理类的 ClassLoader
    val loader = lisi.javaClass.classLoader

    // 动态构建一个代理律师
    val lawyer = Proxy.newProxyInstance(
        loader, arrayOf(ILawsuit::class.java), proxy
    ) as ILawsuit // 强转

    // 流程
    lawyer.submit()
    lawyer.burden()
    lawyer.defend()
    lawyer.finish()

//    静态代理
//    val lisi = LiSi()
//    val zhangwei = Lawyer(lisi)
//    zhangwei.submit()
//    zhangwei.burden()
//    zhangwei.defend()
//    zhangwei.finish()
}
